/********************************************************************************************************************************
 * 《C ++ Primer》第五版中文版，读书笔记：按照书中的的示例源码和每一个小章节的课后习题，自己动手写代码实现，作为联系和测试。
 * Date: 2024-03-21 19:48
 * Author: dimon.chen 
 * EMali: 1181302388@qq.com 
 * 
 * 章节: 第二章 变量和基本类型
 *       2.1 基本内置类型
 * 
 ********************************************************************************************************************************/

#include <iostream>

int main(int argc, char *argv[])
{
	bool b = 42; //b 为真
	int i = b;   //i 的值为1
	
	std::cout << "Bool type b = " << b << std::endl;
	std::cout << "int  type i = " << i << std::endl;
	
	i = 3.14; 	//i的值为3
	std::cout << "int  type i = " << i << std::endl;
	
	double pi = i; 	//pi的值为3.0
	std::cout << "double  type pi = " << pi << std::endl;
	
	unsigned char c = -1; //假设char占8个比特，c的值为255。把一个负数转换为unsigned无符号类型，其值为负数+无符号数的模。这里为 -1+256（模）
	std::cout << "unsigned  char c1 (-1) = " << (int)c << std::endl;
	
	//把一个超过其表示范围的值赋值给一个 signed 有符号类型的变量，其行为是未定义的。
	signed char c2 = 256; //假设char占8个比特，c2的值是未定义的
	std::cout << "signed  char c2 (-1) = " << (int)c2 << std::endl;




	/// 
	/// 含有无符号类型的表达式
	///
#if 0
	int a = -42;
	unsigned u = 10;
	std::cout << a + a << std::endl;

	// 算术表达式里既有 unsigned int 无符号型，又有 int 型。当执行运算时，编译器会把 int 型值
	// 转为无符号型， -42 负值赋给无符号型变量。
	// 相当于 -42 对 32比特所能表示的值得数字取模， 等于 (-42 + 2^32)
	std::cout << u + a << std::endl;



	/// 
	/// 含有无符号类型的表达式，从无符号数中减去一个值
	///
	unsigned u1 = 42, u2 = 10;
	std::cout << u1 - u2 << std::endl; //正确：输出32
	std::cout << u2 - u1 << std::endl; //正确：不过，结果是取模后的值

#endif

	///
	/// 2.1.2 节练习
	/// 练习2.3 读程序写结果
	///
	std::cout << "2.1.2节练习" <<std::endl;
	std::cout << "练习2.3" << std::endl;
	std::cout << "two unsigned int -" << std::endl;
	unsigned u = 10, u2  = 42;
	std::cout << u2 - u << std::endl; //正确：输出32
	std::cout << u - u2 << std::endl; //正确：不过结果是取模后的值。-32对2^32取模，结果为 -32 + 2^32 = 
	/// 2^32 = 4294 9672 96 + (-32) = 4294 9672 64

	std::cout << "int and unsinged int fix " <<std::endl;
	int i1 = 10, i2 = 42;
	std::cout << i2 - i1 << std::endl;  	//Correct: 32
	std::cout << i1 - i2 << std::endl;  	//Correct: -32
	std::cout << i1 - u  << std::endl;  	// i1(int type) 10 first conver to unsigned 10 - 10 = 0 
	std::cout << u - i1  << std::endl;  	// i1(int type) -10 first convert to unsigned -10 + 2^32 + 10 = 0

	return 0;
}